import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
import JSONBig from 'json-bigint'
const request = axios.create({
  // baseURL: 'http://ttapi.research.itcast.cn/app/',
  // baseURL: 'http://toutiao-app.itheima.net/',
  baseURL: process.env.VUE_APP_URL,
  transformResponse: [
    function(data) {
      try {
        return JSONBig.parse(data)
      } catch {
        return data
      }
    }
  ]
})

// 配置请求拦截器
request.interceptors.request.use(
  function(config) {
    // 获取token，配置token
    const tokenInfo = store.state.user.tokenInfo
    if (tokenInfo.token) {
      config.headers.Authorization = 'Bearer ' + tokenInfo.token
    }
    return config
  },
  function(error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 1. 配置axios的响应拦截器
request.interceptors.response.use(
  function(response) {
    // 对响应数据做点什么
    return response
  },
  async function(error) {
    // 2. 判断error.response.status是否是401
    // 3. 如果不是401，说明不是由于token过期导致，不管。
    if (error.response.status !== 401) {
      return Promise.reject(error)
    }
    // 5. 如果错误码是401，说明token过期了
    // 6. 判断vuex中是否有refresh_token。
    // 7. 如果没有，直接拦截到登录页面（删除vuex中token，跳转到登录页，提示）
    const tokenInfo = store.state.user.tokenInfo
    if (!tokenInfo.refresh_token) {
      router.push({
        path: '/login',
        query: {
          back: router.currentRoute.fullPath
        }
      })
      store.commit('user/removeToken')
      return Toast('登录信息失效，请重新登录')
    }
    // 8. 如果有refresh_token， 拿着刷新token重新新的token。
    // 9. 如果成功了，获取到新的token，并且更新到vuex中。重新发送一个请求（才能保证用户无感）
    // 10. 如果失败了，直接拦截到登录页面（删除vuex中token，跳转到登录页，提示）
    try {
      // 注意刷新token使用原始的axios
      const res = await axios({
        method: 'put',
        url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
        headers: {
          Authorization: 'Bearer ' + tokenInfo.refresh_token
        }
      })
      store.commit('user/setToken', {
        token: res.data.data.token,
        refresh_token: tokenInfo.refresh_token
      })
      // 重新发送请求
      return request(error.config)
    } catch {
      router.push({
        path: '/login',
        query: {
          back: router.currentRoute.fullPath
        }
      })
      store.commit('user/removeToken')
      return Toast('登录信息失效，请重新登录')
    }
  }
)

export default request
